package de.herzog.mtv.bb;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

import org.apache.poi.hssf.usermodel.HSSFDateUtil;

public class MitgliederAbgleich {

	private static final String NACHNAME = "Name";
	private static final String VORNAME = "Vorname";
	private static final String ABTEILUNG = "Abteilungsname";
	private static final String BASKETBALL = "Basketball";
	private static final String ABTEILUNGSAUSTRITT = "Abteilungsaustritt";
	private static final String VEREINSAUSTRITT = "Vereinsaustritt";
	private static final String AUSTRITT = "Austritt";
	private static final String ABTEILUNGSEINTRITT = "Abteilungseintritt";
	private static final String VEREINSEINTRITT = "Vereinseintritt";
	private static final String EINTRITT = "Eintritt";

	private static final DateFormat DF = SimpleDateFormat.getDateInstance(DateFormat.MEDIUM, Locale.GERMAN);

	private static String folderName = "H:/My Documents/Privat/Basketball/";
	private static String fileNameMitglieder = folderName + "MTV-Basketball-Mitglieder.xls";
	private static String fileNameEintritte = folderName + "Eintritte.xls";
	private static String fileNameAustritte = folderName + "Austritte.xls";

	private static void updateAustritte(ExcelFile fileMitglieder, ExcelFile fileAustritte)
			throws FileNotFoundException, IOException {
		log("Austritte: -------------------------------------------------------");
		for (ExcelRow rowAustritt : fileAustritte.getRows()) {
			if (BASKETBALL.equals(rowAustritt.getColumn(ABTEILUNG))) {
				updateAustritt(fileMitglieder, rowAustritt);
			}
		}
		log("------------------------------------------------------------------");
	}

	private static void updateAustritt(ExcelFile fileMitglieder, ExcelRow rowAustritt) throws FileNotFoundException,
			IOException {
		String nachname = (String) rowAustritt.getColumn(NACHNAME);
		String vorname = (String) rowAustritt.getColumn(VORNAME);
		System.out.print(vorname + " " + nachname);
		Number austrittNumber = (Number) rowAustritt.getColumn(ABTEILUNGSAUSTRITT);
		if (austrittNumber == null)
			austrittNumber = (Number) rowAustritt.getColumn(VEREINSAUSTRITT);
		Date austrittDate = HSSFDateUtil.getJavaDate(austrittNumber.longValue());
		ExcelRow rowMitglied = fileMitglieder.getRow(NACHNAME, nachname, VORNAME, vorname);
		if (rowMitglied != null) {
			if (rowMitglied.getColumn(AUSTRITT) == null) {
				fileMitglieder.updateRow(rowMitglied, AUSTRITT, austrittDate);
				log("---> OK per Datum " + DF.format(austrittDate));
			} else {
				log("---> Schon ausgetreten");
			}
		} else {
			log("---> Nicht gefunden");
		}
	}

	private static void updateEintritte(ExcelFile fileMitglieder, ExcelFile fileEintritte)
			throws FileNotFoundException, IOException {
		log("Eintritte: -------------------------------------------------------");
		for (ExcelRow rowEintritt : fileEintritte.getRows()) {
			if (BASKETBALL.equals(rowEintritt.getColumn(ABTEILUNG))) {
				updateEintritt(fileMitglieder, rowEintritt);
			}
		}
		log("------------------------------------------------------------------");
	}

	private static void updateEintritt(ExcelFile fileMitglieder, ExcelRow rowEintritt) throws FileNotFoundException,
			IOException {
		String nachname = (String) rowEintritt.getColumn(NACHNAME);
		String vorname = (String) rowEintritt.getColumn(VORNAME);
		String message = vorname + " " + nachname;
		Number eintrittNumber = (Number) rowEintritt.getColumn(ABTEILUNGSEINTRITT);
		if (eintrittNumber == null)
			eintrittNumber = (Number) rowEintritt.getColumn(VEREINSEINTRITT);
		Date eintrittDate = HSSFDateUtil.getJavaDate(eintrittNumber.longValue());
		ExcelRow rowMitglied = fileMitglieder.getRow(NACHNAME, nachname, VORNAME, vorname);
		if (rowMitglied == null) {
			Map<String, Object> values = new HashMap<String, Object>();
			values.put(NACHNAME, nachname);
			values.put(VORNAME, vorname);
			values.put(EINTRITT, eintrittDate);
			fileMitglieder.addRow(values);
			log(message + "---> OK per Datum " + DF.format(eintrittDate));
		} else {
			log(message + "---> Schon eingetreten");
		}
	}

	private static void createBackupFile(String fileName) throws IOException {
		int pos = fileName.lastIndexOf('.');
		String baseName = fileName.substring(0, pos);
		String extension = fileName.substring(pos);
		SimpleDateFormat format = new SimpleDateFormat(".yyyy-MM-dd-hh-mm");
		String date = format.format(new Date());
		Path oldPath = Paths.get(fileName);
		Path newPath = Paths.get(baseName + date + extension);
		Files.copy(oldPath, newPath);
	}

	private static void log(String message) {
		System.out.println(message);
	}

	public static void main(String[] args) throws FileNotFoundException, IOException {

		createBackupFile(fileNameMitglieder);
		ExcelFile fileMitglieder = new ExcelFile(fileNameMitglieder).load();
		ExcelFile fileEintritte = new ExcelFile(fileNameEintritte).load();
		ExcelFile fileAustritte = new ExcelFile(fileNameAustritte).load();
		updateAustritte(fileMitglieder, fileAustritte);
		updateEintritte(fileMitglieder, fileEintritte);
		fileMitglieder.save();
	}
}
